home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
c
/
tsr_asm.zip
/
TSR.ASM
< prev
Wrap
Assembly Source File
|
1988-08-05
|
50KB
|
1,483 lines
page 60,132
; Copyright 1987 by Thomas Brandenborg. All Rights Reserved
; Written for uploading to Compuserve Forums by
;
; Thomas Brandenborg
; Lundbyesgade 11
; DK-8000 Aarhus C
; DENMARK
;
; Modified to work under Lattice-C S model version 2.14
; might work under newer versions as well
; H.F. van Rietschote
;
; You write cpopup() in Lattice-C and you have a popup
; go and become TSR after calling intdos() with ax=0x3100 and dx=_TSIZE
; but after this no more MALLOC(), also not indirect ia fopen() etc.
; allowed.
DGROUP GROUP DATA
DATA SEGMENT WORD PUBLIC 'DATA'
ASSUME DS:DGROUP
DATA ENDS
;==============================================================================
; DEFINE BIOS DATA SEGMENT OFFSETS
;==============================================================================
BiosData segment at 40h
org 17h
KbFlag label byte ;current shift status bits
org 18h
KbFlag1 label byte ;current key status of toggle keys
BiosData ends
;==============================================================================
; DEFINE OFFSETS WITHIN BIOS EXTRA DATA SEGMENT
;==============================================================================
BiosXX segment at 50h
org 0
StatusByte label byte ;PrtSc status
BiosXX ends
ErrPrtSc equ -1 ;err during last PrtSc
InPrtSc equ 1 ;PrtSc in progress
;==============================================================================
; DEFINE OFFSETS WITHIN OUR PSP
;==============================================================================
PGROUP GROUP PROG
PROG SEGMENT BYTE PUBLIC 'PROG'
public tsr,ErrBeep,Bleep
extrn cpopup:near
assume cs:PGROUP, ds:nothing, es:nothing, ss:nothing
;==============================================================================
; IDENTIFICATION CODES FOR THIS TSR (MUST BE UNIQUE FOR EACH CO-EXISTING TSR)
; HIGH BYTE OF GetId MUST NOT MATCH ANY AH REQUEST CODES FOR INT16H.
;==============================================================================
GetId equ 'tc' ;INT16h AX val to get MyId
MyId equ 'TC' ;ID of this TSR
SetAlarm equ 'al' ; set alarm, BX= # of min. to wait
;==============================================================================
; FLAGS AND PTRS FOR RESIDENT HANDLING
;==============================================================================
TsrMode db 0 ;bits for various modes
InInt08 equ 1 SHL 0 ;timer0 tick handler
InInt09 equ 1 SHL 1 ;keyboard handler
InInt13 equ 1 SHL 2 ;BIOS disk I/O
InInt28 equ 1 SHL 3 ;INT28 handler
In28Call equ 1 SHL 4 ;we have issued INT28
InPopup equ 1 SHL 5 ;popup routine activated
NewDos equ 1 SHL 6 ;DOS 2.x in use
InDosClr equ 1 SHL 7 ;InDos=0 at popup time
KeyMode db 0 ;bits for hotkey status
HotIsShift equ 1 SHL 0 ;hotkey is shift state
InHotMatch equ 1 SHL 1 ;so far keys match hotkey seq
HotKeyOn equ 1 SHL 2 ;full hotkey pressed
InDosPtr label dword ;seg:off of InDos flag
InDosOff dw 0
InDosSeg dw 0
CritErrPtr label dword ;seg:off of CritErr flag
CritErrOff dw 0
CritErrSeg dw 0
;==============================================================================
; DATA FOR INT09H HANDLER TO CHECK FOR HOTKEY COMBINATION
;==============================================================================
; ------------ EQU'S FOR BIT SHIFTS WITHIN KEYBOARD FLAGS
InsState equ 80h
CapsState equ 40h
NumState equ 20h
ScrollState equ 10h
AltShift equ 08h
CtlShift equ 04h
LeftShift equ 02h
RightShift equ 01h
InsShift equ 80h
CapsShift equ 40h
NumShift equ 20h
ScrollShift equ 10h
HoldState equ 08h
; ------------ SCAN CODES FOR VARIOUS SHIFT KEYS
LeftDown equ 42 ;scan code of left shift key
LeftUp equ LeftDown OR 80h
RightDown equ 54 ;scan code of right shift key
RightUp equ RightDown OR 80h
AltDown equ 56 ;scan code of alt key
AltUp equ AltDown OR 80h
CtlDown equ 29 ;scan code of ctrl key
CtlUp equ CtlDown OR 80h
; ------------ MISC KEYBOARD DATA
KbData equ 60h ;keyboard data input
;==============================================================================
; TO USE A SHIFT KEY COMBINATION AS HOT KEY:
; - SET THE FLAG HotIsShift IN KeyMode
; - DEFINE THE SHIFT STATUS BITS IN THE VARIABLE HotKeyShift
;
; TO USE A SERIES OF SCAN CODES AS HOT KEY:
; CLEAR THE FLAG HotIsShift IN KeyMode
; - INSERT THE MAKE AND BREAK SCAN CODES IN THE HotKeySeq STRING
; NOTE: WITH THIS DEMO IMPLEMENTATION YOU SHOULD NOT USE A HOT KEY
; SEQUENCE WHICH PRODUCES A KEY IN THE BIOS KEYBOARD QUEUE,
; SINCE THE KEY IS NOT REMOVED BEFORE CALLING THE POPUP ROUTINE.
;
; NOTE: HOTKEY TYPE AND CONTENTS OF HOTKEY VARIABLES MAY BE CHANGED AT RUN TIME
;==============================================================================
HotKeyShift db LeftShift OR RightShift ;shift state IF HotIsShift=FF
; HotKeySeq db LeftDown,LeftUp,LeftDown,LeftUp
HotKeySeq db LeftDown,LeftUp,RightDown,RightUp
HotKeyLen equ $-HotKeySeq
HotIndex db 0 ;# key in seq to compare next
BetweenKeys db 0 ;timeout count between keys
KeyTimeOut equ 10 ;more ticks means not a hotkey
;==============================================================================
; DATA FOR INT08H HANDLER TO CHECK FOR POPUP
;==============================================================================
SafeWait db 0 ;count-down for safe popup
MaxWait equ 8 ;wait no more 8/18 sec
MinLeft dw 0 ; minutes left until alarm
TicksDone dw 0 ; Ticks counted in this minute
Bleeping dw 0 ; 1 means we are bleeping
;==============================================================================
; PROCESS & SYSTEM DATA
;==============================================================================
OurSS dw 0 ;stack for popup routine
OurSP dw 0
OurES dw 0
OurBP dw 0
OurDS dw 0
DSLattice dw 0 ; DS as in Lattice-C
OldSS dw 0 ;old stack seg
OldSP dw 0 ;old stack off
OldES dw 0
OldBP dw 0
OldDS dw 0
OurPSP dw 0 ;our PSP seg
OldPSP dw 0 ;old PSP seg
OldDTA label dword ;seg:off of old DTA area
OldDTAOff dw 0
OldDTASeg dw 0
OurDTA label dword ;seg:off of our DTA
OurDTAOff dw 0
OurDTASeg dw 0
OldBreak db 0 ;old ctrl-break state
OldExtErr dw 3 dup (0) ;AX,BX,CX of ext err
;==============================================================================
; LOCATIONS FOR SAVED INTERRUPT VECTORS
;==============================================================================
OldInt08 label dword ;Timer0 loaded before this
OldInt08Off dw 0
OldInt08Seg dw 0
OldInt09 label dword ;Kb handler loadde before this
OldInt09Off dw 0
OldInt09Seg dw 0
OldInt13 label dword ;BIOS diskette I/O
OldInt13Off dw 0
OldInt13Seg dw 0
OldInt16 label dword ;BIOS kb Q-handler
OldInt16Off dw 0
OldInt16Seg dw 0
OldInt1B label dword ;^break of process we steal
OldInt1BOff dw 0
OldInt1BSeg dw 0
OldI